<?php
namespace app\index\controller;

//数据库操作类
use think\Db;
//http请求类
use think\Request;
//验证器类
use think\Validate;
//缓存类
use think\Cache;
//会话类
use think\Session;


class Index extends \think\Controller
{
    //增加管理员页面
    public function index()
    {
        //判断是否post表单提交
        if(Request::instance()->isPost()){
            // 获取数据
            $data = input('post.');
            // dump($data);
            
            //判断用户名是否存在
            if($data['username']){
                //判断用户名的长度
                $size = strlen($data['username']);
                if($size>=6 && $size<=12){

                    //判断是否输入密码
                    if($data['password']){
                        //判断两次密码是否一致
                        if($data['password'] == $data['repassword']){
                            //全部输入符合要求 数据库匹配
                            $arr['username'] = $data['username'];
                            $arr['password'] = md5($data['password']);
                            $arr['time']     = time();
                            $arr['status']   = $data['status'];

                            if(Db::name('admin')->insert($arr)){
                                $this->success('添加成功');
                            }else{
                                $this->error('添加失败');
                            }

                        }else{
                            $this->error("两次密码不一致");
                        }

                    }else{
                        $this->error("请输入密码");
                    }



                }else{
                    $this->error("请输入6到12位用户名");
                }

            }else{
                $this->error("请输入用户");
            }
            
            // echo "表单提交";
            die;
        }

        $data = Db::name('user')->select();

        //设置缓存 Cache::set(名字,值,时间);    助手函数cache(名字,值,时间)
        // dump(Cache::set('UserData',$data,200));
        // dump(cache('data',$data,200));

        //读取缓存
            // dump(Cache::get('UserData'));
            // dump(cache('data'));
        
        //删除缓存
            Cache::rm('UserData');
            cache('data',NULL);

        //清空缓存
        dump(Cache::clear());

        //返回值 
        //删除成功true
        //删除失败false


        return $this->fetch();
    }

    //设置SESSION
    public function setSession()
    {
        // Session::set('name','南柯一梦');

        // $data = array(
        //     'name'=>'huangxians',
        //     'info'=>'南柯一梦',
        //     'age' =>18
        //     );
        // session("data",$data);

    }
    //获取SESSION
    public function getSession()
    {
        dump(Session::get());
        dump(Session::get('name'));
        dump(Session::get('data'));
    }
    //清除session
    public function delSession()
    {
        Session::clear();

        //使用助手函数
        session(null);
    }
    //判断session中是否存在has(字段名)
    public function pSession()
    {
        dump(Session::has('name1'));
        dump(session("?name1"));
        //返回值  
        //存在  true
        //不存在false
    }


    //缓存的使用
    public function huancun()
    { 
        //从缓存中获取数据
        if($data = cache('UserData')){
            //如果存在
            echo "从缓存内读取数据";

        }else{
            echo '从数据库内读取数据';
            //如果缓存中没有数据
            $data = Db::name('user')->select();
            cache('UserData',$data,20);
        }

        //分配数据
        $this->assign('data',$data);

        //加载页面
        return $this->fetch();
    }

    //验证器 在控制器中使用验证器
    public function kzqyzq()
    {
        //实例化验证器类 
        $validate = new Validate([
                "username"=>"require|length:6,12",
                "password"=>"require|confirm:repassword"
            ],
            [
                "username.require" => '用户名不存在',
                "username.length"  => '用户名长度不满足',
                "password.require" => '密码不存在',
                "password.confirm" => '两次密码不一致',
            ]
            );

        //接收用户提交的数据
        
        $data = input("post.");
        // dump($data);
        // die;
        //进行验证

        if($validate->check($data)){
         //验证通过
            $arr['username'] = $data['username'];
            $arr['password'] = md5($data['password']);
            $arr['time']     = time();
            $arr['status']   = $data['status'];

            if(Db::name('admin')->insert($arr)){
                $this->success('添加成功');
            }else{
                $this->error('添加失败');
            }
           
        }else{
            dump($validate->getError());
        }
    }
    //验证器的封装 validate/Admin.php
    public function yzq()
    {
        //接收数据
        $data = input('post.');
        //实例化验证器
        $validate = new \app\index\validate\Admin;
        // dump($validate);//检查是否实例化成功
        //进行数据验证
        if($validate->check($data)){

        }else{
            dump($validate->getError());
        }
    }

	public function muban()
	{
		//拆查询数据 - 去掉表前缀  3
    	$list = Db::name('data')
    	->where('id','>=',50)
    	->select();
    	// dump($list);
    	// exit();

		//模板变量赋值
		$this->assign('name','<h1>^_^</h1>Rinuo');
		$this->assign('email','2350768356@qq.com');
		//或者批量赋值
		// $this->assign([
		// 	'name' => 'rinuo',
		// 	'email' => '2350768356@qq.com'
	
		//数组赋值
		$data['name'] = 'data_name';
		$data['email'] = 'date_2350768356@qq.com';

		$this->assign('data',$data);
		$this->assign('list',$list);

		//模板输出 - 指定模板文件名
		// return $this->fetch('muban');
		//模板输出 - 使用默认控制器的名字
		//return $this->fetch();
		return $this->fetch('muban');
	}

    public function xiaolian()
    {
        echo '<style type="text/css">*{ padding: 0; margin: 0; } .think_default_text{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p>';
        //插入记录 原生写法
        $result = Db::execute('insert into think_data (name,status) values ("thinkphp1^_^",1)');  
    	dump($result);

    	//插入记录 - 用TP5的查询构造器方法
    	Db::table('think_data')->insert(['name'=>'thinkphp2^_^','status'=>1]);

    	//插入记录 - 去掉表前缀
    	Db::name('data')->insert(['name'=>'thinkphp3^_^']);


    	//插入记录 - 更加简单的写法
    	$db = db('data');
    	//插入记录
    	$result1 = $db->insertGetId(['name'=>'thinkphp4']);
    	dump($result1);//添加数据后如果需要返回新增数据的自增主键，可以使用getLastInsID方法或者直接使用insertGetId方法新增数据并返回主键值：

    	//插入记录 - 返回ID的方法
    	$data = ['name' => 'thinkphp5'];
    	$result2 = Db::name('data')->insertGetId($data);
    	dump($result2);

    	//插入记录 - 插入多条的方法
    	$data = [
    		['name' => 'thinkphp6-1'],
    		['name' => 'thinkphp6-2'],
    		['title' => '标题'],
    		['name' => 'thinkphp6-3']
    	];

    	$result3 = $db->insertAll($data);
    	dump($result3);//insertAll 方法添加数据成功返回添加成功的条数

    }

    public function select()
    {
    	echo "查询数据";
    	//查询数据 - 原生写法 1
    	$result = Db::query('select * from think_data where id = 5');
    	dump($result);//Db::query()遍历输出结果集：

    	//查询数据 - 用TP5的查询构造器方法  2
    	$list = Db::table('think_data')
    	->where('id',18)
    	->select();
    	dump($list);

    	//拆查询数据 - 去掉表前缀  3
    	$list = Db::name('data')
    	->where('id',20)
    	->select();
    	dump($list);

    	//查询数据 - 更加简化的写法 通过助手db函数 4
    	$db = db('data');
    	$list = $db->where('id',22)->select();
    	dump($list);

    }

    public function insert(){
    	echo "插入数据";
   
    	//插入记录 - 用原生写法 - 优点：直接用sql语句
    	$result = Db::execute('insert into think_data (name,status) values ("thinkphp1^_^",1)');  //Db::execute执行预处理语句
    	dump($result);

    	//插入记录 - 用TP5的查询构造器方法
    	Db::table('think_data')->insert(['name'=>'thinkphp2^_^','status'=>1]);

    	//插入记录 - 去掉表前缀
    	Db::name('data')->insert(['name'=>'thinkphp3^_^']);

    	//插入记录 - 更加简单的写法
    	$db = db('data');
    	//插入记录
    	$result1 = $db->insertGetId(['name'=>'thinkphp4^_^']);
    	dump($result);//添加数据后如果需要返回新增数据的自增主键，可以使用getLastInsID方法或者直接使用insertGetId方法新增数据并返回主键值：


    	//插入记录 - 返回ID的方法
    	$data = ['name' => 'thinkphp5'];
    	$result2 = Db::name('data')->insertGetId($data);
    	dump($result2);

    	//插入记录 - 插入多条的方法
    	$data = [
    		['name' => 'thinkphp6-1'],
    		['name' => 'thinkphp6-2'],
    		['name' => 'thinkphp6-3']
    	];

    	$result3 = $db->insertAll($data);
    	dump($result3);//insertAll 方法添加数据成功返回添加成功的条数
    }

    public function delete()
    {
    	echo "删除数据";

    	//删除数据 - 原生写法 1
    	$result = Db::execute("delete from think_data where id = 5");
    	dump($result);

    	//删除数据 - 用TP5的查询构造器方法 2
    	Db::table('think_data')
    	->where('id',18)
    	->delete();

    	//删除数据 - 去掉表前缀 3
    	Db::name('data')
    	->where('id',18)
    	->delete();

    	//删除数据 - 更加简化的写法 通过助手db函数 4
    	$db = db('data');
    	$db->where('id','<',2)->delete();

    	//删除数据 - 根据主键删除 精简写法 5
    	db('data')->delete(1);
    	db('data')->delete([1,8,3]);
    }

    public function update(){
    	echo "<h1>更新数据<h1>";
    	//更新记录 - 原生写法 1
    	$result = Db::execute('update think_data set name = "5^_^" where id <= 5');
    	dump($result);

    	//更新记录 - 用TP5的查询构造器方法 2
    	Db::table('think_data')
    	->where('id',18)
    	->update(['name'=>"18^_^"]);

    	//更新记录 - 去掉表前缀 3
    	Db::name('data')
    	->where('id',16)
    	->update(['name'=>"16^_^"]);

    	//更新记录 - 更加简化的写法 通过助手db函数 4
    	$db = db('data');
    	$db->where('id',20)->update(['name'=>"20^_^",'title'=>"我改变文章标题!"]);
    }

    public function hello($name = 'word')
    {
    	echo 'hello,'.$name.'!你的文章发布成功';

    	//插入记录 - 去掉表前缀
    	// Db::name('data')->insert(['name'=>$name]);

    	//删除数据 - 去掉表前缀 3
    	Db::name('data')
    	->where('name',$name)
    	->delete();
    }

    public function hello3($name = 'Word',$ctiy = '')
    {
    	return 'hello,'.$name.'! You come from'.$ctiy.'.';
    }
}
